#pragma once
#include <iostream>
#include<string>
#include<functional>
#include<pthread.h>
#include<unistd.h>
using namespace std;

template<class T>
using func_t = function<void(T)>;//相当于返回值为void，参数为T的函数指针

namespace cr
{
    template<class T>
    class thread
    {

        friend int main();
    public:
        thread(const func_t<T>& func,const string& name,T time)//func_t<T>必须带上模版参数，否则无法辨别类型
        :_tid(0),_thread_name(name),_is_running(0),_func(func),_time(time)
        {}
        static void* introd(void* pm)//成员函数默认传入this指针
        {
            thread* t=static_cast<thread*>(pm);
            t->_func(t->_time);

            return nullptr;
        }
        void strat()
        {
            int ret = pthread_create(&_tid,nullptr,introd,this);//introd必须是static修饰，否则参数不匹配
            if(!ret)
                cout<<"线程创建成功"<<endl;
            _is_running=1;
        }
        void join()
        {
            //等待之前要判断线程是否退出
            if(!_is_running) return;

            if(!pthread_join(_tid,nullptr))
                cout<<"等待成功"<<endl;
        }
    
    private:
        pthread_t _tid;
        string _thread_name;
        bool _is_running;
        func_t<T> _func;
        T _time;
    };
}